﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Domain.Model.Repositories;
using Domain.Model.Agentes;
using Domain.Model.Base;
using Infrastructure.Base.Persistence;

namespace Infrastructure.Base.InDatabase
{
    public class BAgenteRepository : AgenteRepository
    {
        private List<Agente> lista;

        public BAgenteRepository()
        {
            this.lista = new List<Agente>();
        }

        #region Métodos Heredados Generales

        public override void Insert(Agente entity)
        {
            ContextoInfraccion contexto = new ContextoInfraccion();
            TblAgente obj = new TblAgente();
            
            //Identidad
            obj.id = entity.Identity.Value.ToString();

            //Llaves Foráneas

            //Campos Propios
            obj.apellidos = entity.Apellidos;
            obj.nombres = entity.Nombres;
            obj.placa = entity.Placa;
            obj.rango = entity.Rango;

            //Objetos de Valor
                        

            contexto.AddToTblAgente(obj);
            contexto.SaveChanges();
            contexto.Dispose();
        }

        public override Agente FromId(ObjectIdentity id)
        {
            String idString = id.Value.ToString();
            ContextoInfraccion contexto = new ContextoInfraccion();
            
            TblAgente AgenteBDTmp = contexto.TblAgente.Where(A => A.id == idString).FirstOrDefault();
            contexto.Dispose();

            if (AgenteBDTmp != null)
            {
                Agente oAgente = new Agente(new AgenteId(AgenteBDTmp.id), AgenteBDTmp.nombres, AgenteBDTmp.apellidos, AgenteBDTmp.placa, AgenteBDTmp.rango); ;

                //Asignar la llave primaria de la BD
                oAgente.PK = AgenteBDTmp.pk_agente;

                return oAgente;
            }

            return null;
        }

        public override ObjectIdentity NextIdentity()
        {
            return new AgenteId(Guid.NewGuid().ToString().ToUpper());
        }

        public override void Update(Agente entity)
        {
            String idString = entity.Identity.Value.ToString();
            ContextoInfraccion contexto = new ContextoInfraccion();

            TblAgente obj = contexto.TblAgente.Where(I => I.id == idString).FirstOrDefault();
            
            //Identidad
            obj.id = entity.Identity.Value.ToString();

            //Llaves Foráneas

            //Campos Propios
            obj.apellidos = entity.Apellidos;
            obj.nombres = entity.Nombres;
            obj.placa = entity.Placa;
            obj.rango = entity.Rango;

            //Objetos de Valor
                        

            contexto.SaveChanges();
            contexto.Dispose();
        }

        public override void Remove(ObjectIdentity id)
        {
            String idString = id.Value.ToString();

            ContextoInfraccion contexto = new ContextoInfraccion();
            TblAgente obj = contexto.TblAgente.Where(I => I.id == idString).FirstOrDefault();

            contexto.DeleteObject(obj);
            contexto.SaveChanges();
            contexto.Dispose();
        }

        public override List<Agente> All()
        {
            ContextoInfraccion contexto = new ContextoInfraccion();
            List<TblAgente> listaBD = new List<TblAgente>();

            listaBD = contexto.TblAgente.OrderBy(A => A.nombres).ToList();


            foreach (var item in listaBD)
            {
                Agente obj = new Agente(new AgenteId(item.id),item.nombres, item.apellidos, item.placa,item.rango);
                lista.Add(obj);
            }

            contexto.Dispose();
            return lista;
        }

        public override int Count()
        {
            return All().Count;
        }

        #endregion
    }
}
